package reflect;

import java.io.File;
import java.lang.reflect.Constructor;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;

/**
 * 自动调用与当前类Test3在同一个包中这些类的公开的，无参的，名字里含
 * 有字母"s"的方法
 */
public class Test2 {
    public static void main(String[] args) throws Exception {
        Class cls = Test2.class;
        String packageName = cls.getPackage().getName();
        //定位Test3.class所在的目录
        File dir = new File(
            cls.getResource(".").toURI()
        );
        //获取该目录下的所有字节码文件(目的是确定同一个包中的所有类)
        File[] subs = dir.listFiles(f -> f.getName().endsWith(".class"));
        for(File sub : subs){
            String fileName = sub.getName();
            String className = fileName.substring(0, fileName.indexOf("."));
            className = packageName + "." + className;
            System.out.println(className);


            //实例化
            Class c = Class.forName(className);
            //如果该类没有公开的无参构造器就略过
            Constructor con = c.getDeclaredConstructor();
            if(con.getModifiers() != Modifier.PUBLIC){
                continue;
            }
            Object obj = c.newInstance();
            System.out.println(obj);

            Method[] methods = c.getDeclaredMethods();
            for(Method m : methods){
                if(m.getParameterCount()==0
                        &&
                   m.getName().contains("s")
                        &&
                   m.getModifiers()==Modifier.PUBLIC
                ){
                    System.out.println("自动调用方法:"+m.getName());
                    m.invoke(obj);
                }
            }

        }
    }
}
